package tree

import "fmt"

type Node struct {
	Value       int
	Left, Right *Node // 左指针，右指针
}

// 工厂函数，场景：自己控制构造

func CreateNode(value int) *Node {
	// 相当于定义了一个局部变量，返回了局部变量的地址
	// 注意：返回的是局部变量的地址
	// c++ 中不能返回局部变量
	return &Node{Value: value}
}

// 为结构定义方法
// (node Node) 接收者 相当于 其他语言中的 this
// node 是 传的一个值类型
// 只是调用方式不同
func (node Node) Print() {
	fmt.Println(node.Value)
}

func (node *Node) SetValue(Value int) {
	if node == nil {
		fmt.Println("Setting value to nil node. Ignored.")
		return
	}
	node.Value = Value
}

// 遍历 中序遍历 ， 先遍历左子树
func (node *Node) Traverse() {

	if node == nil {
		return
	}

	node.Left.Traverse()
	node.Print()
	node.Right.Traverse()
}
